package com.dp1.pucp.Simulacion.Controlador;

    import com.dp1.pucp.Administracion.DAO.RRHHDAO;
    import com.dp1.pucp.Modelo.Algoritmos.EmpleadoAlgoritmo;
    import com.dp1.pucp.Modelo.Clases.Empleado;
    import com.dp1.pucp.Modelo.Clases.Historico;
import com.dp1.pucp.Modelo.Clases.Superhombre;
    import com.dp1.pucp.Simulacion.DAO.SimulacionDAO;
    import com.dp1.pucp.Simulacion.VIsta.AsignacionEmpleadosGUI;
    import com.dp1.pucp.Simulacion.VIsta.AsignacionMaquinasGUI;
    import com.dp1.pucp.Simulacion.VIsta.DetalleMaquinaGUI;
    import com.dp1.pucp.Simulacion.VIsta.DetalleOperarioGUI;
    import com.dp1.pucp.Simulacion.VIsta.MantSimulacionGUI;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.ArrayList;
    import javax.swing.JTable;
    import javax.swing.table.DefaultTableModel;

    /**
     *
     * @author Rodrigo
     */
    public class AsignacionEmpleadosControlador {

        private AsignacionEmpleadosGUI vistaEmpleados;
        private SimulacionControlador controladorPadre;
        private MantSimulacionGUI vistaPadre;
        private SimulacionDAO s;
        private RRHHDAO r;
        private DetalleOperarioGUI vistaDetalle;
        private ArrayList<Empleado> empleadosTotal;
        private ArrayList<EmpleadoAlgoritmo> arregloEmpleadosTurno1;
        private ArrayList<EmpleadoAlgoritmo> arregloEmpleadosTurno2;
        private ArrayList<EmpleadoAlgoritmo> arregloEmpleadosTurno3;
        private int turnoActivo;




        public AsignacionEmpleadosControlador(SimulacionDAO dao, AsignacionEmpleadosGUI vista, SimulacionControlador controladorPadre,ArrayList<Empleado> empleadosTotal,ArrayList<EmpleadoAlgoritmo> arregloEmpleadosTurno1,ArrayList<EmpleadoAlgoritmo> arregloEmpleadosTurno2,ArrayList<EmpleadoAlgoritmo> arregloEmpleadosTurno3,int turno){
            this.vistaEmpleados=vista;
            this.empleadosTotal=empleadosTotal;
            this.controladorPadre=controladorPadre;
            this.arregloEmpleadosTurno1=arregloEmpleadosTurno1;
            this.arregloEmpleadosTurno2=arregloEmpleadosTurno2;
            this.arregloEmpleadosTurno3=arregloEmpleadosTurno3;
            this.ActualizarTabla();
            vistaEmpleados.addExaminarListener(new examinarListener());
            vistaEmpleados.addCancelarListener(new cancelarListener());
            System.out.println("TURNO ES :"+turno);
            vistaEmpleados.activarTurno(turno);
            //vistaEmpleados.addGuardarListener(new guardarListener());


        }

        public AsignacionEmpleadosControlador getControlador(){    
            //metodo para obtener el controlador
            return this;     
        }

        public void ActualizarTabla(){

            this.LimpiarDatos();
            this.llenaGrilla(this.empleadosTotal,this.arregloEmpleadosTurno1,this.arregloEmpleadosTurno2,this.arregloEmpleadosTurno3);
        }


        public void LimpiarDatos(){    
            ((DefaultTableModel) vistaEmpleados.getTablaTurno1().getModel()).setRowCount(0); 
            ((DefaultTableModel) vistaEmpleados.getTablaTurno2().getModel()).setRowCount(0); 
            ((DefaultTableModel) vistaEmpleados.getTablaTurno3().getModel()).setRowCount(0); 
        }

        public Empleado buscarEmpleado(int id){

            for (int i=0; i<empleadosTotal.size(); i++){
                if (empleadosTotal.get(i).getIdempleado()==id){
                    return empleadosTotal.get(i);
                }
            }

            return null;
        }


        public void llenaGrilla(ArrayList<Empleado> lista,ArrayList<EmpleadoAlgoritmo> Turno1, ArrayList<EmpleadoAlgoritmo> Turno2, ArrayList<EmpleadoAlgoritmo> Turno3){        
            if(Turno1!=null){ 
                ((DefaultTableModel) vistaEmpleados.getTablaTurno1().getModel()).setRowCount(0);
                for (int i = 0; i<Turno1.size();i++){
                    ((DefaultTableModel) vistaEmpleados.getTablaTurno1().getModel()).setRowCount(vistaEmpleados.getTablaTurno1().getRowCount()+1);
                    Empleado emp=buscarEmpleado(Turno1.get(i).getIdempleado());
                    String nombre = emp.getNombre()+" "+emp.getApPaterno()+" "+emp.getApMaterno();
                    vistaEmpleados.getTablaTurno1().setValueAt(nombre,i,0);
                    int eficiencia = Turno1.get(i).getProduccion()[0]-Turno1.get(i).getMermas()[0];
                    vistaEmpleados.getTablaTurno1().setValueAt(eficiencia,i,1);
                    eficiencia=Turno1.get(i).getProduccion()[1]-Turno1.get(i).getMermas()[1];
                    vistaEmpleados.getTablaTurno1().setValueAt(eficiencia,i,2);
                    eficiencia=Turno1.get(i).getProduccion()[2]-Turno1.get(i).getMermas()[2];
                    vistaEmpleados.getTablaTurno1().setValueAt(eficiencia,i,3);
                    eficiencia=Turno1.get(i).getProduccion()[3]-Turno1.get(i).getMermas()[3];
                    vistaEmpleados.getTablaTurno1().setValueAt(eficiencia,i,4);
                 }
            }

            if(Turno2!=null){ 
                ((DefaultTableModel) vistaEmpleados.getTablaTurno2().getModel()).setRowCount(0);
                for (int i = 0; i<Turno2.size();i++){
                    ((DefaultTableModel) vistaEmpleados.getTablaTurno2().getModel()).setRowCount(vistaEmpleados.getTablaTurno2().getRowCount()+1);
                    Empleado emp=buscarEmpleado(Turno2.get(i).getIdempleado());
                    String nombre = emp.getNombre()+" "+emp.getApPaterno()+" "+emp.getApMaterno();
                    vistaEmpleados.getTablaTurno2().setValueAt(nombre,i,0);
                    int eficiencia = Turno2.get(i).getProduccion()[0]-Turno2.get(i).getMermas()[0];
                    vistaEmpleados.getTablaTurno2().setValueAt(eficiencia,i,1);
                    eficiencia=Turno2.get(i).getProduccion()[1]-Turno2.get(i).getMermas()[1];
                    vistaEmpleados.getTablaTurno2().setValueAt(eficiencia,i,2);
                    eficiencia=Turno2.get(i).getProduccion()[2]-Turno2.get(i).getMermas()[2];
                    vistaEmpleados.getTablaTurno2().setValueAt(eficiencia,i,3);
                    eficiencia=Turno2.get(i).getProduccion()[3]-Turno2.get(i).getMermas()[3];
                    vistaEmpleados.getTablaTurno2().setValueAt(eficiencia,i,4);
                 }
            }

            if(Turno3!=null){ 
                ((DefaultTableModel) vistaEmpleados.getTablaTurno3().getModel()).setRowCount(0);
                for (int i = 0; i<Turno3.size();i++){
                    ((DefaultTableModel) vistaEmpleados.getTablaTurno3().getModel()).setRowCount(vistaEmpleados.getTablaTurno3().getRowCount()+1);
                    Empleado emp=buscarEmpleado(Turno3.get(i).getIdempleado());
                    String nombre = emp.getNombre()+" "+emp.getApPaterno()+" "+emp.getApMaterno();
                    vistaEmpleados.getTablaTurno3().setValueAt(nombre,i,0);
                    int eficiencia = Turno3.get(i).getProduccion()[0]-Turno3.get(i).getMermas()[0];
                    vistaEmpleados.getTablaTurno3().setValueAt(eficiencia,i,1);
                    eficiencia=Turno3.get(i).getProduccion()[1]-Turno3.get(i).getMermas()[1];
                    vistaEmpleados.getTablaTurno3().setValueAt(eficiencia,i,2);
                    eficiencia=Turno3.get(i).getProduccion()[2]-Turno3.get(i).getMermas()[2];
                    vistaEmpleados.getTablaTurno3().setValueAt(eficiencia,i,3);
                    eficiencia=Turno3.get(i).getProduccion()[3]-Turno3.get(i).getMermas()[3];
                    vistaEmpleados.getTablaTurno3().setValueAt(eficiencia,i,4);
                 }
            }
        }


        class cancelarListener implements ActionListener {

            @Override
            public void actionPerformed(ActionEvent e) {

                vistaEmpleados.dispose();

            }

        }

        class guardarListener implements ActionListener {
            @Override
            public void actionPerformed(ActionEvent e) {

            }

        }

        class examinarListener implements ActionListener {
            @Override
            public void actionPerformed(ActionEvent e) {

                int selTurno1 = -1;
                int selTurno2 = -1;
                int selTurno3 = -1;
                int bandera=0;

                selTurno1 = vistaEmpleados.getFilaSelTurno1();
                selTurno2 = vistaEmpleados.getFilaSelTurno2();
                selTurno3 = vistaEmpleados.getFilaSelTurno3();

                if ((selTurno1==-1) && (selTurno2==-1) && (selTurno3==-1)){
                    vistaEmpleados.mostrarError("Debe seleccionar un operario");
                }
                else {

                    if (selTurno1 != -1) {
                        EmpleadoAlgoritmo empA = arregloEmpleadosTurno1.get(selTurno1);
                        Empleado emp = buscarEmpleado(empA.getIdempleado());
                        DetalleOperarioGUI gui = new DetalleOperarioGUI(vistaEmpleados.getPadre(), true);
                        gui.setTitle("Detalle de Operario");
                        AsignacionEmpleadosControlador padre = getControlador();
                        DetalleOperarioControlador controlador = new DetalleOperarioControlador(empA, emp, gui, padre, selTurno1);
                        gui.setVisible(true);
                    }
                    if (selTurno2 != -1) {
                        EmpleadoAlgoritmo empA = arregloEmpleadosTurno2.get(selTurno2);
                        Empleado emp = buscarEmpleado(empA.getIdempleado());
                        DetalleOperarioGUI gui = new DetalleOperarioGUI(vistaEmpleados.getPadre(), true);
                        gui.setTitle("Detalle de Operario");
                        AsignacionEmpleadosControlador padre = getControlador();
                        DetalleOperarioControlador controlador = new DetalleOperarioControlador(empA, emp, gui, padre, selTurno2);
                        gui.setVisible(true);
                    }
                    if (selTurno3 != -1) {
                        EmpleadoAlgoritmo empA = arregloEmpleadosTurno3.get(selTurno3);
                        Empleado emp = buscarEmpleado(empA.getIdempleado());
                        DetalleOperarioGUI gui = new DetalleOperarioGUI(vistaEmpleados.getPadre(), true);
                        gui.setTitle("Detalle de Operario");
                        AsignacionEmpleadosControlador padre = getControlador();
                        DetalleOperarioControlador controlador = new DetalleOperarioControlador(empA, emp, gui, padre, selTurno3);
                        gui.setVisible(true);
                    }

                }           
            }    
        }


         public void redistribuirTurno( EmpleadoAlgoritmo emp ,int  posicion, int turnonuevo){//recibira la clase empleado de la tabla 
                switch (emp.getTurno()){                                                 //tambien la posicion de la tabla que es la posicion del arreglo en la que se encontro
                    case 1: arregloEmpleadosTurno1.remove(posicion);                    //y el turno nuevo
                            break;
                    case 2: arregloEmpleadosTurno2.remove(posicion);
                            break;
                    case 3: arregloEmpleadosTurno3.remove(posicion);

                }
                EmpleadoAlgoritmo nuevo = copiarEmp(emp);           
                nuevo.setTurno(turnonuevo);
                                recalculaHistorico(nuevo);

                switch (turnonuevo){//te lo meto el nuevo metodo historico

                    case 1:            
                        arregloEmpleadosTurno1.add(nuevo);

                          //  controladorPadre.leerHistoricos2(arregloEmpleadosTurno1);
                            break;
                    case 2:    arregloEmpleadosTurno2.add(nuevo);
                            //controladorPadre.leerHistoricos2(arregloEmpleadosTurno2);
                            break;
                    case 3:   
                        arregloEmpleadosTurno3.add(nuevo);
                            //controladorPadre.leerHistoricos2(arregloEmpleadosTurno3);           
                }          
        }
         public void recalculaHistorico(EmpleadoAlgoritmo emp){
              s = new SimulacionDAO();
              int bandera=0;
              ArrayList<Historico> historicoemp = s.historiaEmpleado(emp.getIdempleado(), emp.getTurno());//por cada operario obtendre su historico
               int[] produccion = new int[4];
               int[] mermas = new int[4];
               int [] contadores = new int[4];//contara los hisoricos para cada tipo de maquina
               int sumaprod=0;
                    int sumamerm = 0;
               Superhombre superhombre = s.getSuperHombre(emp.getIdempleado());
            if (superhombre.getIdsuperhombre() != 0) {
                if (superhombre.getEstado() == 1) {
                    produccion[0] = superhombre.getProduccionHorneado();
                    produccion[1] = superhombre.getProduccionDecorado();
                    produccion[2] = superhombre.getProduccionRellenado();
                    produccion[3] = superhombre.getProduccionEmpaquetado();
                    mermas[0] = superhombre.getMermaHorneado();
                    mermas[1] = superhombre.getMermaDecorado();
                    mermas[2] = superhombre.getMermaRellenado();
                    mermas[3] = superhombre.getMermaEmpaquetado();
                    bandera = 1;
                }
                bandera = 0;
            }
               if (bandera == 0) {
               for(int j=0 ; j < historicoemp.size();j++){
                   Historico historico = historicoemp.get(j);

                   switch( historico.getTipomaquina().getIdtipomaquina()){//por cada historico del empleado calculare su promedio de produ y merm
                       case 1:  //observare a que tipo de maquina corresponde esa produccion y merma
                                 sumaprod = produccion[0]*contadores[0];
                                 sumamerm = mermas[0]*contadores[0];
                                contadores[0] = contadores[0] + 1;
                                produccion[0] = (sumaprod + historico.getProduccion())/contadores[0];//saco el promedio de produccion
                                mermas[0] = (sumamerm+ historico.getMerma())/contadores[0];

                                break;
                       case 2:
                                 sumaprod = produccion[1]*contadores[1];
                                 sumamerm = mermas[1]*contadores[1];
                                contadores[1] = contadores[1] + 1;
                                produccion[1] = (sumaprod + historico.getProduccion())/contadores[1];
                                mermas[1] = (sumamerm+ historico.getMerma())/contadores[1];
                                break;
                       case 3: 
                                 sumaprod = produccion[2]*contadores[2];
                                 sumamerm = mermas[2]*contadores[2];

                                contadores[2] = contadores[2] + 1;
                                produccion[2] = (produccion[2] + historico.getProduccion())/contadores[2];
                                mermas[2] = (mermas[2]+ historico.getMerma())/contadores[2];
                                break;
                       case 4:
                                sumaprod = produccion[3]*contadores[3];
                                 sumamerm = mermas[3]*contadores[3];
                                contadores[3] = contadores[3] + 1;
                                produccion[3] = (produccion[3] + historico.getProduccion())/contadores[3];
                                mermas[3] = (mermas[3]+ historico.getMerma())/contadores[3];

                   }

               }
               }
               emp.setProduccion(produccion);
               emp.setMermas(mermas);
               emp.calcularCap(produccion, mermas);
               //this.arregloEmpleadosAlgoritmo.add(emp);
           }



         public EmpleadoAlgoritmo copiarEmp(EmpleadoAlgoritmo emp){
            EmpleadoAlgoritmo nuevo=new EmpleadoAlgoritmo();
           // Galleta nuevoGalleta;
            nuevo.setIdempleado(emp.getIdempleado());
            int[] prod = new int[4];
            int[] merm = new int[4];
            double[] efi = new double[4];

           // 
            for(int i =0 ;i< emp.getCapacidad().length; i++){
                prod[i] = emp.getProduccion()[i];
                merm[i] = emp.getMermas()[i];
                efi[i] = emp.getEficiencia()[i];
            }
            nuevo.setProduccion(prod);
            nuevo.setMermas(merm);
            //nuevo.setCapacidad(emp.getCapacidad());  
            nuevo.setEficiencia(efi);
            nuevo.setTipoMaquinaAsignada(emp.getTipoMaquinaAsignada());
            nuevo.setMaquina(emp.getMaquina());
            nuevo.calcularCap(nuevo.getProduccion(), nuevo.getMermas());
            nuevo.setTurno(emp.getTurno());
            //nuevoGalleta=copiarGalleta(emp.getGalletaAsignada());
           // nuevo.setGalletaAsignada(nuevoGalleta);

            return nuevo; 
       }

    }